/*
 * RutasDocumentos.cpp
 *
 *  Created on: 06/11/2011
 *      Author: putaro
 */

#include "RutasDocumentos.h"
#include <iostream>

/*
 * Pre: El parámetro ruta es la dirección del directorio dónde se encuentran
 * el archivo que tiene las rutas concatenadas y el archivo que tiene los
 * punteros al mismo.
 * 	Ejemplo de ruta: "/home/"
 * Pos: Se ha creado la instancia quedando lista para realizar consultas sobre
 * las rutas recuperadas.
*/
RutasDocumentos::RutasDocumentos(const string & ruta) {
	//armo ruta del principal y punteros
	string rutaPrincipal = ruta;
	string rutaPunteros = ruta;
	rutaPrincipal.append("/");
	rutaPunteros.append("/");
	rutaPrincipal.append(NOMBRE_PRINCIPAL_RUTAS);
	rutaPunteros.append(NOMBRE_PUNTEROS_RUTAS);
	this->principal.open(rutaPrincipal.c_str());
	this->punteros.open(rutaPunteros.c_str() , ios::in | ios::binary);
}

/*
 * Pre: La instancia ha sido creada.
 * Post: Se retorna un puntero a una instancia de string que contiene la ruta
 * de la siguiente ruta recuperada.
 * RETURNS: Si no se pudo recurrar la ruta se retorna NULL.
*/
RutasDocumentos::~RutasDocumentos() {
	this->principal.close();
	this->punteros.close();
}

/*
 * Pre: La instancia ha sido creada y el parámetro es el id de un documento
 * válido.
 * Post: Se retorna un puntero a una instancia de string que contiene la ruta
 * del documento dado por el id pasado por parámetro.
 * RETURNS: Si no se pudo recurrar la ruta se retorna NULL.
*/
string* RutasDocumentos::readNext(){
	string* retorno = NULL;
	T_RegistroIndiceRutasDocumentos registro;
	registro.idDocumento = 0;
	registro.longitudRuta = 0;
	registro.puntero = 0;
	if(!this->punteros.eof()){
		unsigned int largo = 0;
		this->punteros.read(reinterpret_cast<char *>(&registro),
					  sizeof(T_RegistroIndiceRutasDocumentos));
		largo = registro.longitudRuta+1;
		char* cadena = NULL;
		if (largo >1) {
			cadena = new char[(int)largo];
			memset(cadena,0,largo);
			principal.clear();
			principal.seekg(registro.puntero , ios::beg);
			this->principal.get(cadena,largo);
			retorno = new string(cadena);
			delete[] (cadena);
		}
	}
	return retorno;
}

/*
 * Pre: La instancia ha sido creada.
 * Post: La instancia ha sido destruida liberando recursos.
*/
string* RutasDocumentos::read(unsigned int idDocumento){
	punteros.clear();
	principal.clear();
	this -> punteros.seekg((idDocumento-1)*sizeof(T_RegistroIndiceRutasDocumentos),ios::beg);
	return this -> readNext();
}
